EmoTrack 2:情绪分
第2次迭代,将命中 EmoTrack 的核心功能,跟踪情绪。
灵感来自于 rating 打分组件,简化一些,设置数个 emoji,分配对应的得分:
- 2:😆,喜出望外,开心!
- 1:🙂,惬意,心情不错
- 0:😐,平平,心情不好不坏
- -1:😣,不开心,烦
- -2:😭,崩溃,蓝瘦香菇
EmoScore
UI 组件实现完成后,下面考虑如何实现逻辑。
首先是数据实体 EmoScore,需要创建一个新 model。
model 中我设计一个key:2023102213,以小时作为时间戳,而不是以秒作为时间戳。存为 int 类型。
这样,我后续在统计绘图的时候,可以直接 select。
之所以用小时作为时间戳,希望在每天不同时段,都可以进行情绪选择。
为什么不用更细粒度?比如分钟?那样变化过于频繁,用户操作起来很累。
class EmoScore extends Table {
IntColumn get id => integer().autoIncrement()();
DateTimeColumn get hourTimestamp => dateTime().unique()();
IntColumn get score => integer()();
}
增删改查逻辑
首页有个定时器,需要由他来生成 hourTimestamp,并传入打分组件中。
并且通过 ValueKey,每次 hourTimestamp 变更后,打分组件会自动变更。
这样,只需要在打分组件内部,自己的生命周期里实现创造时查,变更时改就可以了。
获取,注意返回是可空的:
Future<EmoScoreData?> getSingleEmoScoreByTs(DateTime dt) =>
(select(emoScore)..where((t) => t.hourTimestamp.equals(dt)))
.getSingleOrNull();
下面是点击 Emoji 后的修改逻辑。还是 insertOnConflictUpdate 方法,一招鲜。
具体在点击回调中,还是要处理新建和修改的逻辑,参考 Todo 添加页,还是分开处理。
migration
在 Drift 中,新增表,需要进行 migration 操作。
之所以选择 Drift,是因为它在 migration 上提供诸多遍历,到了体验的时候。文档1
Drift migration 便利性体现在两方面:
- migration 的 helper 方法非常便利
- 还提供了命令行工具,能根据前后 schema 对比,自动生成 migration 的代码
我感觉,使用 helper 进行手动 migration 就足够方便了。
数据库也升级到 v2 了。
migration 代码如下:
MigrationStrategy get migration {
return MigrationStrategy(onCreate: (Migrator m) async {
m.createAll();
}, onUpgrade: (Migrator m, int from, int to) async {
if (from < 3) {
/// version 2
await m.createTable(emoScore);
}
});
}
找到一篇好文章《【Flutter】Driftのマイグレーション》,文章中提到一个库《drift_db_viewer | Flutter Package》对数据库进行统一浏览,正好满足我的需要。
Bingo!
本文作者:Maeiee
本文链接:EmoTrack 2:情绪分
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!